import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

/**
 * 最后一个单词的长度
 * 题目：给定一个仅包含大小写字母和空格' '的字符串 s，返回其最后一个单词的长度。如果字符串从左向右滚动显示，那么最后一个单词就是最后出现的单词。
 * 如果不存在最后一个单词，请返回 0。
 * <p>
 * 说明：一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。
 * <p>
 * 示例:
 * 输入: "Hello World"
 * 输出: 5
 * <p>
 * 来源：力扣（LeetCode-58）
 * 链接：https://leetcode-cn.com/problems/length-of-last-word
 *
 * @author godfrey
 * @since 2020-10-29
 */
@DisplayName("最后一个单词的长度")
public class LengthOfLastWord extends BaseTest {

    @DisplayName("从右边往左-时间复杂度：O(n),空间复杂度：O(1)")
    @ParameterizedTest
    @ValueSource(strings = {"Hello World ", "abc"})
    void lengthOfLastWord(String s) {
        s = s.trim();
        if (s.isEmpty()) {
            System.out.println(0);
            return;
        }
        int begin = 0;
        for (int i = s.length() - 1; i >= 0; --i) {
            if (s.charAt(i) == ' ') {
                begin = i+1;
                break;
            }
        }
        System.out.println(s.length() - begin);
    }

    @DisplayName("库函数-时间复杂度：O(n),空间复杂度：O(1)")
    @ParameterizedTest
    @ValueSource(strings = {"Hello World ", "abc"})
    void lengthOfLastWord2(String s) {
        s = s.trim();
        System.out.println(s.length() - 1 - s.lastIndexOf(" "));
    }

    @DisplayName("计数-时间复杂度：O(n),空间复杂度：O(1)")
    @ParameterizedTest
    @ValueSource(strings = {"Hello World ", "abc"})
    void lengthOfLastWord3(String s) {
        int res = 0, i = s.length() - 1;
        while (i >= 0) {
            if (s.charAt(i--) != ' ') {
                res++; // 非空则计数
            } else if (res > 0) {
                System.out.println(res);
                return;
            }; // 为空，但之前已经计过数了
        }
        System.out.println(res);
    }
}
